﻿using Pe.Petecos.Comercial.Cross.Core.Constantes;
using Pe.Petecos.Comercial.Infraestructura.Core.Contract.Ventas;
using Pe.Petecos.Comercial.Infraestructura.Model.Ventas;
using Pe.Petecos.Comercial.Infraestructura.Repository.Base;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Pe.Petecos.Comercial.Infraestructura.Repository.Implements.Ventas
{
    public class OrdenCompraRepository : QueryRepository, IOrdenCompraRepository
    {
        public List<OrdenCompraLogic> Buscar(int codigoOrdenCompra = 0, int codigoProveedor = 0, int codigoProyecto = 0, string codigoEstado = "", string nombreProveedor = "", string nombreProyecto = "", DateTime? fechaInicio = null, DateTime? fechaFin = null)
        {
            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_ORDEN_COMPRA", SqlDbType.Int) { Value = (object)codigoOrdenCompra ?? DBNull.Value },
                new SqlParameter("CODIGO_PROVEEDOR", SqlDbType.Int) { Value = (object)codigoProveedor ?? DBNull.Value },
                new SqlParameter("CODIGO_PROYECTO", SqlDbType.Int) { Value = (object)codigoProyecto ?? DBNull.Value },
                new SqlParameter("CODIGO_ESTADO_ORDEN_COMPRA", SqlDbType.VarChar) { Value = (object)codigoEstado ?? DBNull.Value },
                new SqlParameter("NOMBRE_PROVEEDOR", SqlDbType.VarChar) { Value = (object)nombreProveedor ?? DBNull.Value },
                new SqlParameter("NOMBRE_PROYECTO", SqlDbType.VarChar) { Value = (object)nombreProyecto ?? DBNull.Value },
                new SqlParameter("FECHA_INICIO", SqlDbType.DateTime) { Value = (object)fechaInicio ?? DBNull.Value },
                new SqlParameter("FECHA_FIN", SqlDbType.DateTime) { Value = (object)fechaFin ?? DBNull.Value },
                new SqlParameter("PARAMETRO_ESTADO_ORDEN_COMPRA", SqlDbType.Int) { Value = DatosConstantes.Parametro.EstadoOrdenCompra },
                new SqlParameter("PARAMETRO_MONEDA", SqlDbType.Int) { Value = DatosConstantes.Parametro.Moneda }
            };

            return this.dataBaseProvider.ExecuteStoreProcedure<OrdenCompraLogic>("VTA.USP_ORDEN_COMPRA_SEL", parametros).ToList();
        }

        public int Insertar(OrdenCompraEntity ordenCompra)
        {
            var detalle = ordenCompra.ListaOrdenCompraDetalle.Select(x => new
            {
                CODIGO_ARTICULO = x.CodigoArticulo,
                CODIGO_PROVEEDOR = 0,
                PRECIO_ARTICULO = x.PrecioArticulo,
                CANTIDAD = x.Cantidad,
                MONTO_TOTAL = x.MontoTotal
            }).ToList();

            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_PROYECTO", SqlDbType.Int) { Value = (object)ordenCompra.CodigoProyecto ?? DBNull.Value },
                new SqlParameter("CODIGO_PROVEEDOR", SqlDbType.Int) { Value = (object)ordenCompra.CodigoProveedor ?? DBNull.Value },
                new SqlParameter("CODIGO_MONEDA", SqlDbType.NVarChar) { Value = (object)ordenCompra.CodigoMoneda ?? DBNull.Value },
                new SqlParameter("FECHA_ENTREGA", SqlDbType.DateTime) { Value = (object)ordenCompra.FechaEntrega ?? DBNull.Value },
                new SqlParameter("LUGAR_ENTREGA", SqlDbType.NVarChar){ Value = (object)ordenCompra.LugarEntrega ?? DBNull.Value },
                new SqlParameter("OBSERVACIONES", SqlDbType.NVarChar){ Value = (object)ordenCompra.Observaciones ?? DBNull.Value },
                
                new SqlParameter("MONTO_ADELANTO", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoAdelanto ?? DBNull.Value },
                new SqlParameter("NUMERO_CUOTA", SqlDbType.Int){ Value = (object)ordenCompra.NumeroCuota ?? DBNull.Value },
                new SqlParameter("FRECUENCIA_CUOTA", SqlDbType.Int){ Value = (object)ordenCompra.FrecuenciaCuota ?? DBNull.Value },
                
                new SqlParameter("MONTO_SUBTOTAL", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoSubTotal ?? DBNull.Value },
                new SqlParameter("MONTO_IGV", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoIgv ?? DBNull.Value },
                new SqlParameter("MONTO_DETRACCION", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoDetraccion ?? DBNull.Value },
                new SqlParameter("MONTO_TOTAL", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoTotal ?? DBNull.Value },

                new SqlParameter("CODIGO_ESTADO", SqlDbType.NVarChar){ Value = (object)ordenCompra.CodigoEstado ?? DBNull.Value },
                new SqlParameter("USUARIO_CREACION", SqlDbType.NVarChar){ Value = (object)ordenCompra.UsuarioCreacion ?? DBNull.Value },
                new SqlParameter("LISTA_ORDEN_COMPRA_DETALLE", SqlDbType.Structured) { Value = detalle.ToDataTable(), TypeName = "VTA.TYPE_LISTA_ORDEN_COMPRA_DETALLE" }
            };
            return this.dataBaseProvider.ExecuteStoreProcedureScalar<int>("VTA.USP_ORDEN_COMPRA_INS", parametros);
        
        }

        public int Modificar(OrdenCompraEntity ordenCompra)
        {
            var detalle = ordenCompra.ListaOrdenCompraDetalle.Select(x => new
            {
                CODIGO_ARTICULO = x.CodigoArticulo,
                CODIGO_PROVEEDOR = 0,
                PRECIO_ARTICULO = x.PrecioArticulo,
                CANTIDAD = x.Cantidad,
                MONTO_TOTAL = x.MontoTotal
            }).ToList();

            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_ORDEN_COMPRA", SqlDbType.Int) { Value = (object)ordenCompra.CodigoOrdenCompra ?? DBNull.Value },
                
                new SqlParameter("CODIGO_PROYECTO", SqlDbType.Int) { Value = (object)ordenCompra.CodigoProyecto ?? DBNull.Value },
                new SqlParameter("CODIGO_PROVEEDOR", SqlDbType.Int) { Value = (object)ordenCompra.CodigoProveedor ?? DBNull.Value },
                new SqlParameter("CODIGO_MONEDA", SqlDbType.NVarChar) { Value = (object)ordenCompra.CodigoMoneda ?? DBNull.Value },
                new SqlParameter("FECHA_ENTREGA", SqlDbType.DateTime) { Value = (object)ordenCompra.FechaEntrega ?? DBNull.Value },
                new SqlParameter("LUGAR_ENTREGA", SqlDbType.NVarChar){ Value = (object)ordenCompra.LugarEntrega ?? DBNull.Value },
                new SqlParameter("OBSERVACIONES", SqlDbType.NVarChar){ Value = (object)ordenCompra.Observaciones ?? DBNull.Value },
                
                new SqlParameter("MONTO_ADELANTO", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoAdelanto ?? DBNull.Value },
                new SqlParameter("NUMERO_CUOTA", SqlDbType.Int){ Value = (object)ordenCompra.NumeroCuota ?? DBNull.Value },
                new SqlParameter("FRECUENCIA_CUOTA", SqlDbType.Int){ Value = (object)ordenCompra.FrecuenciaCuota ?? DBNull.Value },
                
                new SqlParameter("MONTO_SUBTOTAL", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoSubTotal ?? DBNull.Value },
                new SqlParameter("MONTO_IGV", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoIgv ?? DBNull.Value },
                new SqlParameter("MONTO_DETRACCION", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoDetraccion ?? DBNull.Value },
                new SqlParameter("MONTO_TOTAL", SqlDbType.Decimal){ Value = (object)ordenCompra.MontoTotal ?? DBNull.Value },

                new SqlParameter("CODIGO_ESTADO", SqlDbType.NVarChar){ Value = (object)ordenCompra.CodigoEstado ?? DBNull.Value },
                new SqlParameter("USUARIO_MODIFICACION", SqlDbType.NVarChar){ Value = (object)ordenCompra.UsuarioModificacion ?? DBNull.Value },
                new SqlParameter("LISTA_ORDEN_COMPRA_DETALLE", SqlDbType.Structured) { Value = detalle.ToDataTable(), TypeName = "VTA.TYPE_LISTA_ORDEN_COMPRA_DETALLE" }
            };
            return this.dataBaseProvider.ExecuteStoreProcedureNonQuery("VTA.USP_ORDEN_COMPRA_UDP", parametros);
        }

        public int ModificarEstado(List<int> codigos, string codigoEstado, string usuario)
        {
            var lista = codigos.Select(x => new
            {
                CODIGO = x
            }).ToList();

            SqlParameter[] parametros = new SqlParameter[]
            {
                
                new SqlParameter("LISTA_CODIGO", SqlDbType.Structured) { Value = lista.ToDataTable(), TypeName = "GRL.TYPE_LISTA_CODIGO" },
                new SqlParameter("CODIGO_ESTADO", SqlDbType.VarChar){ Value = (object)codigoEstado ?? DBNull.Value },
                new SqlParameter("USUARIO_MODIFICACION", SqlDbType.VarChar){ Value = (object)usuario ?? DBNull.Value }
            };
            return this.dataBaseProvider.ExecuteStoreProcedureNonQuery("VTA.USP_ORDEN_COMPRA_ESTADO_UDP", parametros);
        }

        public List<OrdenCompraDetalleLogic> BuscarDetalle(int codigoOrdenCompra)
        {
            SqlParameter[] parametros = new SqlParameter[]
            {
                new SqlParameter("CODIGO_ORDEN_COMPRA", SqlDbType.Int) { Value = (object)codigoOrdenCompra ?? DBNull.Value }
            };

            return this.dataBaseProvider.ExecuteStoreProcedure<OrdenCompraDetalleLogic>("VTA.USP_ORDEN_COMPRA_DETALLE_SEL", parametros).ToList();
        }
    }
}
